/*
 * @lc app=leetcode.cn id=15 lang=javascript
 *
 * [15] 三数之和
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
    let res = []
    if (nums === null || nums.length < 3) return res
    nums.sort((a, b) => a - b)
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] > 0) break
        if (i > 0 && nums[i] === nums[i - 1]) continue
        let L = i + 1
        let R = nums.length - 1
        while (L < R) {
            if (nums[i] + nums[L] + nums[R] === 0) {
                res.push([nums[i], nums[L], nums[R]])
                while (L < R && nums[L] == nums[L + 1]) L++; // 去重
                while (L < R && nums[R] == nums[R - 1]) R--; // 去重
                L++
                R--
            }
            else if (nums[i] + nums[L] + nums[R] < 0) L++
            else if (nums[i] + nums[L] + nums[R] > 0) R--
        }
    }
    return res
};
// @lc code=end

